#include "global_config.h"
#include "public_datas.h"

#define TAG "DEBUG"

static void debug_uart_rec(uint8_t tmp)
{
    // if (drv_sleep_get_state() == ENABLE)
    //     drv_sleep_set_wake_reason(WAKE_BY_DEBUG);

    uart_cmd_get_byte(tmp);
}

static void debug_log_printf(const char *str, size_t len)
{
    uart_send(UART_DEBUG_CH, (uint8_t *)str, len);
    // uart_send(UART_SF32_CH, (uint8_t *)str, len);
}

static void hw_set_en(en_state_t en)
{
    esay_logi(TAG, "debug set en %s", string_en_status[en]);
    public_datas()->debug_state = en;
    esay_log_set_log_en(ESAY_LOG_ALL, en);
    if (en == ENABLE)
    {
        gpio_set_mode(USB_DP, GPIO_MODE_IN_FLOAT);
        gpio_set_mode(USB_DM, GPIO_MODE_IN_FLOAT);
        gpio_set_level(UART_DEBUG_TXD, 1);
        uart_init(UART_DEBUG_CH, UART_DEBUG_BAUDRATE, UART_DEBUG_TXD, UART_DEBUG_RXD, NULL);
        gpio_set_mode(UART_RTS, GPIO_MODE_IN_FLOAT);
    }
    else
    {
        gpio_set_mode(USB_DP, GPIO_MODE_IN_PULLDOWN);
        gpio_set_mode(USB_DM, GPIO_MODE_IN_PULLDOWN);
        DelayMs(100);
        uart_deinit(UART_DEBUG_CH);
        gpio_set_mode(UART_DEBUG_TXD, GPIO_MODE_IN_PULLDOWN);
        gpio_set_mode(UART_DEBUG_RXD, GPIO_MODE_IN_PULLDOWN);
        gpio_set_mode(UART_RTS, GPIO_MODE_IN_PULLDOWN);
    }
}

void drv_debug_set_state(en_state_t en)
{
    if (public_datas()->debug_state == en)
        return;
    hw_set_en(en);
}

static void usb_conn_cb(void *arg, size_t len)
{
    drv_debug_set_state(ENABLE);
    // gpio_set_level(SF32_EN, 1);
}

static void usb_disconn_cb(void *arg, size_t len)
{
    drv_debug_set_state(DISABLE);
    // gpio_set_level(SF32_EN, 0);
}

void drv_debug_install(void)
{
#if DEBUG_IC_LOCK_CH // 日志锁定为WCH输出到PC
    gpio_set_mode(UART_LOCK_CH, GPIO_MODE_OUT_PUSHPULL_5mA);
    gpio_set_level(UART_LOCK_CH, HIGH);
#else
    gpio_set_mode(UART_LOCK_CH, GPIO_MODE_IN_PULLDOWN);
#endif

    gpio_set_mode(BTN_USB, GPIO_MODE_IN_FLOAT);
    if (gpio_get_level(BTN_USB) == HIGH) // 如果插入了USB则开启调试串口
    {
        public_datas()->usb_sta = ONLINE;
        hw_set_en(ENABLE);
    }
    else
        hw_set_en(DISABLE);

    uart_set_rec_cb(UART_DEBUG_CH, debug_uart_rec); //
    esay_log_attach_print_cb(debug_log_printf);     // 回调函数
    esay_logp("\n\n\n\n\n\n---------------POWER ON---------------\n\n");

    topic_messenger_subscribe(NULL, "usb_conn", usb_conn_cb);
    topic_messenger_subscribe(NULL, "usb_disconn", usb_disconn_cb);
}
